//
//  Google_Search.m
//  MacStockApp
//
//  Created by 英傑 翁 on 12/2/29.
//  Copyright (c) 2012年 翁英傑. All rights reserved.
//

#import "Google_Search.h"

@implementation Google_Search

- (id)init_identify:(NSString *)ident {
	
    if(self=[super init])
	{
        
        identify=ident;
        
        
    }
	
	return self;
}

-(void)dealloc{
    
    
    [super dealloc];
}



-(NSMutableArray *)get_search_array_data:(NSString *)serachstrings {
    
    //1.下載網址
    NSString *urls=[NSString stringWithFormat: @"http://www.google.com/finance/match?matchtype=matchall&q=%@",serachstrings] ;      
    
    NSURL *  urla;
    urla = [NSURL URLWithString:urls];
    
    NSError * errorq = nil;
    NSString * download_string;
    //2.取出下載資料
    download_string=[NSString stringWithContentsOfURL:urla encoding: NSUTF8StringEncoding error:&errorq];
    
    //3.下載資料整理
    //特別注意 Google 的名稱搜尋下載字串中 可能有包含 ' 與 ＆ 兩個特別字串 這兩個字元 下載之後會以 \26 \27表示 所以就需要
    //使用下面這段程式碼將它修正
    NSString *caa=    [[[[download_string stringByReplacingOccurrencesOfString:@"\\x27" withString:@"\'"] stringByReplacingOccurrencesOfString:@"\\x26" withString:@"&"] stringByReplacingOccurrencesOfString:@"\\x2" withString:@""] stringByReplacingOccurrencesOfString:@"\\x26F" withString:@""]   ; 
    
    //4.將下載文字資料整理後經過 JSONValue 取出想要的結構資料
    //NSLog(@"caa=%@",caa);
    NSMutableArray *jsonvalue_elements = [[caa JSONValue] objectForKey:@"matches"]  ;    
    if ([[caa JSONValue] objectForKey:@"matches"]) {
        
    }
    else {
        NSLog(@"Error JSONValue=%@",caa);
    }
    
    
    NSMutableArray *outarray=[[[NSMutableArray alloc] init] autorelease];
    
    
    
    
    for (NSDictionary *ass in jsonvalue_elements ) {
        
        NSMutableDictionary *temdic=[[[NSMutableDictionary alloc] init] autorelease];
        
        NSString *code_s;         //全名
        NSString *symbol_s;       //代碼
        NSString *country_s;      //交易所代碼  
        NSString *name_s;         //名稱
        NSString *typeDisp_s=@"na";     //標的種類
        NSString *exchDisp_s;     //交易所名稱
        NSString *class_s=@"na"; //yahoo 資料不提供證券產業類別        
        
        
        
        
        if ([[ass objectForKey:@"t"] retainCount]>0 && [[ass objectForKey:@"e"] retainCount]>0 ) {
            
            symbol_s=[ass objectForKey:@"t"];
            code_s=[NSString stringWithFormat:@"%@:%@",[ass objectForKey:@"e"], [ass objectForKey:@"t"]];
            
        }
        else {
            symbol_s=@"na";
            code_s=@"na";
            
        }   
        
        if ([[ass objectForKey:@"n"] retainCount]>0) {
            
            name_s=[ass objectForKey:@"n"] ;            
        }
        else {
            name_s=@"";
        }           
        
        
        
        
        if ([[ass objectForKey:@"e"] retainCount]>0) {
            
            country_s=[ass objectForKey:@"e"];
            exchDisp_s=[ass objectForKey:@"e"];
        }
        else {
            country_s=@"na";
            exchDisp_s=@"na";           
        }            
        
        [temdic setObject:code_s forKey:@"code"];
        [temdic setObject:symbol_s forKey:@"symbol"];
        [temdic setObject:country_s forKey:@"country"];        
        [temdic setObject:name_s forKey:@"name"];
        [temdic setObject:typeDisp_s forKey:@"typeDisp"];
        [temdic setObject:exchDisp_s forKey:@"exchDisp"];        
        [temdic setObject:class_s forKey:@"class"];        
        
        
        
        [outarray addObject:temdic];        
        
        
        
        
        
    }
    //使用json分解技巧 
    //先將字串進行jsonvalue取出資料結構：ＥＸ：[caa JSONValue]  
    //如果要取得 {"symbol":"2330.tw","name":"TSMC" } 裡面這些資料是使用NSDictionary 來取得    
    //如果是 [{...},{...}] 表示是陣列 要用NSMutableArray
    return outarray;

}
/* 取用原則
 
 1.股票
 報價：      google->yahoo->bloomberg
 日內資料：   google->yahoo->bloomberg
 日線歷史資料:yahoo->google->bloomberg 為何要先採用yahoo理由：1.google沒有還權 2.google的日線資料僅可以取用到美國本土資料(http://www.google.com/finance/historical?q=NASDAQ%3ANFLX&startdate=Jun+5%2C+2001&enddate=Nov+4%2C+2012&output=csv)
 
 2.指數
 全部都使用google資料
 
 */

/*
//輸入google代碼之後 分析比較要取用的報價伺服器與歷史資料伺服器是採用哪一個
+(NSMutableDictionary*)analyze_web_data:(NSString *)google_code{
    
   
    
    
    //google代碼轉換成為yahoo 與bloomberg代碼
    NSString *yahoo_code;
    NSString *bloomberg_code;
    {
                 
        yahoo_code=[self input_googleCode_get_yahooCode:google_code];
        
        bloomberg_code=[self input_googleCode_get_bloombergCode:google_code];        
        
        NSLog(@"g=%@ y=%@ b=%@",google_code,yahoo_code,bloomberg_code);
    }
    
    
    
    NSMutableDictionary *dic=[[[NSMutableDictionary alloc] init]autorelease];
    [dic setObject:@"yahoo" forKey:@"Quote_Server"];

    
    
    
    //檢查報價
    {
        //檢查是否有google資料
    
    
    
    }
    //日內資料
    {
        
        
        
    }
    //日線歷史資料
    {
        
        
        
    }
    
    return dic;
}
 
//輸入google代碼轉換成yahooo代碼
+(NSString *)input_googleCode_get_yahooCode:(NSString *)googlecode{
    
    NSMutableDictionary *outaic=[[[NSMutableDictionary alloc] init]autorelease];
    
    NSString *yahooCode;
    NSString *bloombergCode;
    
    
    //1.取出google code中的交易所代碼 與股票代碼
    NSString *google_exchange;
    NSString *google_symbol; //不含交易所碼或國家碼
    {
        NSArray *ga=[googlecode componentsSeparatedByString:@":"];
        if ([ga count]==2) {
            google_symbol=[ga objectAtIndex:1];
            google_exchange=[ga objectAtIndex:0];
            
            //NSLog(@"google_symbol=%@ google_exchange=%@",google_symbol,google_exchange );
            
        }
        else {
            //
            NSLog(@"google輸入代碼有誤");
            return nil;
        }
   
    
    
    }
    
    //2.依照不同交易所進行轉換
    {
        //美國交易所 股票
        if ([google_exchange isEqualToString:@"NASDAQ"] ||
            [google_exchange isEqualToString:@"NYSE"] ||
            [google_exchange isEqualToString:@"NYSEAMEX"]||
            [google_exchange isEqualToString:@"NYSEARCA"]||
            [google_exchange isEqualToString:@"OTC"]||
            [google_exchange isEqualToString:@"PINK"]) {
            
            //代碼如果內部有. 就要轉換為-
            yahooCode=[google_symbol stringByReplacingOccurrencesOfString:@"." withString: @"-" ];             
        }
        //美國交易所 指數       
        else if ([google_exchange isEqualToString:@"INDEXASX"] ||
                 [google_exchange isEqualToString:@"INDEXDJX"] ||
                 [google_exchange isEqualToString:@"INDEXNASDAQ"]){
            
            yahooCode=@"NOexchange";
        }
        
        //加拿大
        else if ([google_exchange isEqualToString:@"TSE"]) {
             yahooCode=[NSString stringWithFormat:@"%@.%@",google_symbol,@"TO"];
        }
        //加拿大
        else if ([google_exchange isEqualToString:@"CVE"]) {
            yahooCode=[NSString stringWithFormat:@"%@.%@",google_symbol,@"V"];
        }
        //加拿大
        else if ([google_exchange isEqualToString:@"CNSX"]) {
            //YAHOO 沒有此資料庫
           yahooCode=@"NOexchange";
        }
        
        
        //台灣交易所
        else if ([google_exchange isEqualToString:@"TPE"]) {
            
            BOOL google_valid;
            BOOL yahoo_valid;
            //不判讀bloomberg有效性
            
            //1.代碼分析與有效性判斷
            { 
                //a.bloomberg 代碼
                {
                    bloombergCode=[NSString stringWithFormat:@"%@.TT",google_symbol];
                }          
                
                //b.google 代碼有效性與產生yahoo代碼
                {
                    
                    if ([xxServer_Valid is_google_code_valid:googlecode]) {
                        
                        //如果google只有台灣上市資料 所以如果google資料存在表示就是上市股票或是指數
                        google_valid=YES;
                        yahooCode=[NSString stringWithFormat:@"%@.%@",google_symbol,@"TW"];
                    }
                    else{
                        google_valid=NO;
                        yahooCode=[NSString stringWithFormat:@"%@.%@",google_symbol,@"TWO"];
                    }
                    
                    
                }
                
                //yahoo 有效性
                {
                    if ([xxServer_Valid is_yahoo_code_valid:yahooCode]) {
                        //表示是股票
                        yahoo_valid=YES;
                        
                    }
                    else{
                        //表示是指數
                        yahoo_valid=NO;
                        
                        
                    }
                
                }
                           
            }
            
            //2.建立字典
            {
                //代碼 
                {
                    [outaic setObject:googlecode forKey:Code_Google];
                    [outaic setObject:yahooCode  forKey:Code_Yahoo];
                    [outaic setObject:bloombergCode  forKey:Code_Bloomberg];
                }
                
                //伺服器選擇
                {
                    //日內報價資料 googel->yahoo
                    {
                        if (google_valid) {
                            [outaic setObject:S_Google forKey:Server_Quote];
                        }
                        else{
                            if (yahoo_valid) {
                                [outaic setObject:S_Yahoo forKey:Server_Quote];
                            }
                            else{
                                [outaic setObject:S_Bloomberg forKey:Server_Quote];
                            }
                        }
                        
                        
                        
                    }
                    
                    //歷史資料 yahoo->google
                    {
                        if (yahoo_valid) {
                            [outaic setObject:S_Yahoo forKey:Server_History];
                        }
                        else{
                            if (google_valid) {
                                [outaic setObject:S_Google forKey:Server_History];
                            }
                            else{
                                [outaic setObject:S_Bloomberg forKey:Server_History];
                            }
                        }
                    
                    }
                    
                }
            }
                     
            NSLog(@"dic=%@",outaic);
        
            
        }
        //台灣交易所 上櫃 很重要這是google沒有的交易所 是自行增加的虛擬交易所,yahoo有此資料庫
        else if ([google_exchange isEqualToString:@"TPEO"]) {
            yahooCode=[NSString stringWithFormat:@"%@.%@",google_symbol,@"TWO"];
        }
        //台灣交易所 期貨 很重要這是google沒有的交易所 是自行增加的虛擬交易所,yahoo無此資料庫
        else if ([google_exchange isEqualToString:@"TPEF"]) {
            yahooCode=google_symbol;
        }
        
        //完全無法判斷
        else{
          yahooCode=@"NOexchange";
        }
        
    }        
        
    return yahooCode;
   

}

//輸入google代碼轉換成bloomberg代碼
+(NSString *)input_googleCode_get_bloombergCode:(NSString *)googlecode{
    
    NSString *bloombergCode;
    
    //取出google code中的交易所代碼 與股票代碼
    NSString *google_exchange;
    NSString *google_symbol;  //不含交易所碼或國家碼
    {
        NSArray *ga=[googlecode componentsSeparatedByString:@":"];
        if ([ga count]==2) {
            google_symbol=[ga objectAtIndex:1];
            google_exchange=[ga objectAtIndex:0];
            
            //NSLog(@"google_symbol=%@ google_exchange=%@",google_symbol,google_exchange );
            
        }
        else {
            //
            NSLog(@"google輸入代碼有誤");
            return nil;
        }
        
        
        
    }
    
    //2.依照不同交易所進行轉換
    {
        //美國交易所 上市
        if ([google_exchange isEqualToString:@"NASDAQ"] ||
            [google_exchange isEqualToString:@"NYSE"] ||
            [google_exchange isEqualToString:@"NYSEAMEX"]||
            [google_exchange isEqualToString:@"NYSEARCA"]||
            [google_exchange isEqualToString:@"OTC"]||
            [google_exchange isEqualToString:@"PINK"]) {
            
            //代碼如果內部有. 就要轉換為/
            bloombergCode=[google_symbol stringByReplacingOccurrencesOfString:@"." withString: @"/" ];
            
            //加入bloomberg國碼
            bloombergCode=[NSString stringWithFormat:@"%@:US",bloombergCode];
            
        }
        //美國交易所 指數
        else if ([google_exchange isEqualToString:@"INDEXASX"] ||
                 [google_exchange isEqualToString:@"INDEXDJX"] ||
                 [google_exchange isEqualToString:@"INDEXNASDAQ"]){
            
            bloombergCode=@"NOexchange";
        }

        
        //台灣交易所 上市
        else if ([google_exchange isEqualToString:@"TPE"]) {
            bloombergCode=[NSString stringWithFormat:@"%@.%@",google_symbol,@"TW"];
        }
        //台灣交易所 上櫃 很重要這是google沒有的交易所 是自行增加的虛擬交易所,yahoo有此資料庫
        else if ([google_exchange isEqualToString:@"TPEO"]) {
            bloombergCode=[NSString stringWithFormat:@"%@.%@",google_symbol,@"TWO"];
        }
        //台灣交易所 期貨 很重要這是google沒有的交易所 是自行增加的虛擬交易所,yahoo無此資料庫
        else if ([google_exchange isEqualToString:@"TPEF"]) {
            bloombergCode=google_symbol;
        }
        else{
           bloombergCode=@"NOexchange";
        }
        
    } 
    
    return bloombergCode;
    
    
}
*/



@end
